package com.hjw.httpclient.controller;

import com.hjw.httpclient.pojo.request.UserRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

/**
 * @author hjwStrart
 * @time 2022-11-09 20:13
 * @version: 1.0
 */
@RestController
@RequestMapping("/form")
public class FormController {

    @Autowired
    private HttpServletRequest request;

    // 使用浏览器发送请求，浏览器会自动对请求参数进行一次 urlencode 编码
    // 我们在表单中输入的参数是：userName = admin，userPwd = hjw+123
    // 实际传递的参数确实这样的：userName = admin userPwd = hjw%2B123
    // http://localhost:8080/form/get?userName=admin&userPwd=hjw%2B123
    // 这个过程就是 urlencode 的编码
    // web容器（也是服务器，通常是tomcat）接收到这个url请求就会自动对请求的url进行 urlencode 的解码
    // 这样 服务器 接受的参数才是我们在表单中输入的参数。
    // 但是当我们使用 HttpClient 模拟 浏览器发送请求时，不会对请求参数进行 urlencode 编码的，服务器在
    // 接受我们的请求参数时会自动的对i请求参数进行一次 urlencode 的解码，这就可能导致服务器接收的请求参数
    // 和我们在表单输入的参数不一致。
    @GetMapping(value = "/get")
    public String formRequestGet(String userName, @RequestParam String userPwd) {
        System.out.println("业务参数：" + userName + " : " + userPwd);
        return "userName=" + userName + ",userPwd=" + userPwd;
    }

    @PostMapping(value = "/post")
    public String formRequestPost(String userName, String userPwd) {
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            System.out.println(headerName + "：" + request.getHeader(headerName));
        }
        return "userName=" + userName + ",userPwd=" + userPwd;
    }

    @PostMapping(value = {"/testJson"})
    public String formRequestPost(@RequestBody UserRequest userRequest) {

        System.out.println("userRequest = " + userRequest);
        return "success";
    }

    @PostMapping(value = {"/upload"})
    public void fileUpload(UserRequest userRequest, @RequestParam(value = "upload") MultipartFile[] multipartFiles) {

        System.out.println("其他参数" + userRequest);
        for (MultipartFile multipartFile : multipartFiles) {
            System.out.println("上传文件名 = " + multipartFile.getOriginalFilename());
        }
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            System.out.println(headerName + " = " + request.getHeader(headerName));
        }
    }
}